﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace WindowsFormsApplication1
{
    public partial class Tablas : Form
    {
        OracleCommand comando;
        OracleDataReader datos;
        NpgsqlCommand comandopsg;
        NpgsqlDataReader datospsg;
        int selectedrowm, selectedrowf;

        private void enable_controls()
        {

            lbl_actualizando.Visible = false;
            this.Refresh();
        }

        private void disable_controls()
        {
            lbl_actualizando.Visible = true;
            this.Refresh();
        }



        public void ver_tablas()
        {

            String sentenciamine, sentenciaforeign;
            int i = 0, j, columnas;

            try
            {
                dgv_mine.Rows.Clear();
                dgv_mine.Columns.Clear();

                dgv_foreign.Rows.Clear();
                dgv_foreign.Columns.Clear();

                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                

                if (frm_login.oracle)
                {
                    sentenciamine = "select table_name nombre, owner dueño, tablespace_name tablespace, initial_extent, next_extent, max_extents, pct_free, pct_used from all_tables where owner = '" + frm_login.user + "'";
                    sentenciaforeign = "select table_name nombre, owner dueño, tablespace_name tablespace, initial_extent, next_extent, max_extents, pct_free, pct_used from all_tables where owner <> '" + frm_login.user + "'";
                    comando = new OracleCommand(sentenciamine, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_mine.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_mine.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_mine.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }
                    i = 0;
                    comando = new OracleCommand(sentenciaforeign, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_foreign.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_foreign.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_foreign.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }
                }
                else
                {
                    sentenciamine = "SELECT tablename nombre, tableowner dueño, \"tablespace\" FROM pg_tables where tableowner = '"+frm_login.user+"'";
                    sentenciaforeign = "SELECT tablename nombre, tableowner dueño, \"tablespace\" FROM pg_tables where tableowner <> '" + frm_login.user + "'";
                    comandopsg = new NpgsqlCommand(sentenciamine, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_mine.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_mine.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_mine.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                    i = 0;
                    comandopsg = new NpgsqlCommand(sentenciaforeign, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_foreign.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_foreign.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_foreign.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        public Tablas()
        {
            InitializeComponent();
        }

        private void Tablas_Load(object sender, EventArgs e)
        {
            this.Refresh();
            ver_tablas();
        }


        private void lbl_info_mine_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Form w = new InfoTabla();
            w.Text = dgv_mine.Rows[selectedrowm].Cells[0].Value.ToString();
            w.Show();
            
        }

        private void dgv_mine_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            lbl_info_mine.Visible = true;
            selectedrowm = e.RowIndex;
        }

        private void dgv_foreign_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            lbl_info_foreign.Visible = true;
            selectedrowf = e.RowIndex;
        }

        private void lbl_info_foreign_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Form w = new InfoTabla();
            w.Text = dgv_foreign.Rows[selectedrowf].Cells[0].Value.ToString();
            w.Show();
            
        }

        private void btn_cerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void llb_actualizar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ver_tablas();
        }

    }
}
